// utils/globalErrorHandler.js - 全局错误处理工具

/**
 * 全局业务错误处理
 * 统一处理服务端接口返回的 code !== 0 的情况
 * @param {Object} error - 错误对象
 * @param {Object} options - 处理选项
 * @param {string} options.title - 弹窗标题，默认为"操作失败"
 * @param {boolean} options.showModal - 是否显示弹窗，默认为true
 * @param {string} options.defaultMessage - 默认错误信息
 * @returns {boolean} 是否处理了错误
 */
const handleBusinessError = (error, options = {}) => {
  const {
    title = "操作失败",
    showModal = true,
    defaultMessage = "操作失败，请重试",
  } = options;

  // 检查是否是业务错误（有code字段且不等于0）
  if (
    error &&
    typeof error === "object" &&
    error.code !== undefined &&
    error.code !== 0
  ) {
    const errorMessage = error.message || error.msg || defaultMessage;

    console.log("业务错误处理:", {
      code: error.code,
      message: errorMessage,
      error: error,
    });

    if (showModal) {
      wx.showModal({
        title: title,
        content: errorMessage,
        showCancel: false,
        confirmText: "知道了",
      });
    }

    return true; // 表示已处理
  }

  return false; // 表示未处理
};

/**
 * 全局网络错误处理
 * @param {Object} error - 错误对象
 * @param {Object} options - 处理选项
 * @returns {boolean} 是否处理了错误
 */
const handleNetworkError = (error, options = {}) => {
  const { showModal = true } = options;

  // 检查是否是网络错误
  if (error && typeof error === "object" && error.errMsg) {
    let errorMessage = "网络连接失败";

    if (error.errMsg.includes("timeout")) {
      errorMessage = "请求超时，请检查网络";
    } else if (error.errMsg.includes("fail")) {
      errorMessage = "网络请求失败，请检查网络连接";
    } else if (error.errMsg.includes("domain")) {
      errorMessage = "域名配置错误，请联系开发者";
    }

    if (showModal) {
      wx.showModal({
        title: "网络错误",
        content: errorMessage,
        showCancel: false,
        confirmText: "知道了",
      });
    }

    return true; // 表示已处理
  }

  return false; // 表示未处理
};

/**
 * 全局错误处理入口
 * 自动识别错误类型并处理
 * @param {Object} error - 错误对象
 * @param {Object} options - 处理选项
 * @returns {boolean} 是否处理了错误
 */
const handleGlobalError = (error, options = {}) => {
  console.error("全局错误处理:", error);

  // 优先处理业务错误
  if (handleBusinessError(error, options)) {
    return true;
  }

  // 处理网络错误
  if (handleNetworkError(error, options)) {
    return true;
  }

  // 其他未知错误
  const { showModal = true, defaultMessage = "操作失败，请重试" } = options;

  if (showModal) {
    wx.showModal({
      title: "操作失败",
      content: defaultMessage,
      showCancel: false,
      confirmText: "知道了",
    });
  }

  return true;
};

/**
 * 创建带错误处理的API调用包装器
 * @param {Function} apiCall - API调用函数
 * @param {Object} errorOptions - 错误处理选项
 * @returns {Function} 包装后的函数
 */
const withGlobalErrorHandling = (apiCall, errorOptions = {}) => {
  return async (...args) => {
    try {
      return await apiCall(...args);
    } catch (error) {
      handleGlobalError(error, errorOptions);
      throw error; // 重新抛出错误，让调用方知道发生了错误
    }
  };
};

module.exports = {
  handleBusinessError,
  handleNetworkError,
  handleGlobalError,
  withGlobalErrorHandling,
};
